import { execSync } from 'child_process';
import fs from 'fs';
import path from 'path';
import type { Plugin } from 'vite';

interface GitInfo {
  branch: string;
  commit: string;
  tag: string;
  repository: string;
}

interface VersionContent {
  repository: string;
  branch: string;
  tag: string;
  commit: string;
  buildDate: string;
}

interface PluginOptions {
  /** 输出文件路径，默认 'version.json' */
  outputPath?: string;
}

/**
 * Vite插件：生成包含Git信息和构建时间的version.json文件
 * @param {PluginOptions} options - 插件配置选项
 * @returns {Plugin} Vite插件配置
 */
function vitePluginVersionJson(options: PluginOptions = {}): Plugin {
  const {
    outputPath = 'version.json'
  } = options;

  // 存储Vite配置的输出目录
  let outDir: string;

  // 获取Git相关信息
  function getGitInfo(): GitInfo {
    try {
      // 获取当前分支
      const branch = execSync('git rev-parse --abbrev-ref HEAD').toString().trim();

      // 获取最后一次提交的commit hash
      const commit = execSync('git rev-parse --short HEAD').toString().trim();

      // 获取最近的tag（如果没有则为空）
      let tag = '';
      try {
        tag = execSync('git describe --abbrev=0 --tags').toString().trim();
      } catch (e) {
        // 没有tag时会抛出错误，这里忽略
      }

      // 自动获取仓库地址（从origin remote）
      let repository = '';
      try {
        repository = execSync('git config --get remote.origin.url').toString().trim();
        // 处理不同格式的仓库地址（移除.git后缀）
        repository = repository.replace(/\.git$/, '');
      } catch (e) {
        console.warn('获取仓库地址失败，将使用空值', e);
        repository = '';
      }

      return { branch, commit, tag, repository };
    } catch (e) {
      console.warn('获取Git信息失败，使用默认值', e);
      return {
        branch: 'unknown',
        commit: 'unknown',
        tag: '',
        repository: ''
      };
    }
  }

  // 生成version.json内容
  function generateVersionContent(): VersionContent {
    const gitInfo = getGitInfo();
    const buildDate = new Date().toLocaleString('zh-CN', {
      year: 'numeric',
      month: '2-digit',
      day: '2-digit',
      hour: '2-digit',
      minute: '2-digit',
      second: '2-digit',
      hour12: false
    }).replace(/\//g, '-');

    return {
      repository: gitInfo.repository,
      branch: gitInfo.branch,
      tag: gitInfo.tag,
      commit: gitInfo.commit,
      buildDate
    };
  }

  return {
    name: 'vite-plugin-version-json',
    // 获取Vite配置的输出目录，添加config参数类型
    configResolved(config: { build: { outDir: string } }) {
      outDir = config.build.outDir;
    },

    // 在构建结束后生成文件
    closeBundle() {
      try {
        const content = generateVersionContent();
        const distPath = path.resolve(process.cwd(), outDir, outputPath);

        // 确保输出目录存在
        fs.mkdirSync(path.dirname(distPath), { recursive: true });

        // 写入文件
        fs.writeFileSync(
            distPath,
            JSON.stringify(content, null, 2),
            'utf-8'
        );

        console.log(`✅ 已生成版本信息文件: ${distPath}`);
      } catch (error) {
        console.error('❌ 生成version.json失败:', error);
      }
    }
  };
}

export default vitePluginVersionJson;
